BITS 32
%include "macrosmodoprotegido.mac"
extern pic1_intr_end

%define TSS_0_DESC 0x20
%define TSS_1_DESC 0x28
%define TSS_2_DESC 0x30

current_task: db 1

; ----------------------------------------------------------------
; Interrupt Service Routines
; TODO: Definir el resto de las ISR
; ----------------------------------------------------------------

global _isr0
msgisr0: db 'EXCEPCION: Division por cero'
msgisr0_len equ $-msgisr0
_isr0:
	mov edx, msgisr0
	IMPRIMIR_TEXTO edx, msgisr0_len, 0x0C, 0, 0, 0x13000
	jmp $

global _isr8
msgisr8: db 'EXCEPCION: Double fault'
msgisr8_len equ $-msgisr8
_isr8:
	mov edx, msgisr8
	IMPRIMIR_TEXTO edx, msgisr8_len, 0x0C, 0, 0, 0x13000
	jmp $

global _isr10
msgisr10: db 'EXCEPCION: Invalid TSS'
msgisr10_len equ $-msgisr10
_isr10:
	mov edx, msgisr10
	IMPRIMIR_TEXTO edx, msgisr10_len, 0x0C, 0, 0, 0x13000
	jmp $

; void next_clock(void)
global next_clock
next_clock:

	; deshabilito las interrupciones

	cli

	; Aviso al PIC que atendi la interrupcion
	mov al,0x20
	out 0x20, al

	; task switch

	cmp byte [current_task], 1
	jne jmp_task_1

	mov byte [current_task], 2
	jmp TSS_2_DESC:0
	; habilito las interrupciones y vuelvo

	jmp fin

jmp_task_1:

	mov byte [current_task], 1
	jmp TSS_1_DESC:0

fin:

	; habilito las interrupciones y vuelvo
	sti
	iret

global _isr33
_isr33:

	cli

	; Aviso al PIC que atendi la interrupcion

	mov al,0x20
	out 0x20, al

	; habilito las interrupciones y vuelvo

	sti
	iret

global _isr_default
msgisrdefault: db 'EXCEPCION: Interrupcion sin rutina'
msgisrdefault_len equ $-msgisrdefault
_isr_default:
	mov edx, msgisrdefault
	IMPRIMIR_TEXTO edx, msgisrdefault_len, 0x0C, 0, 0, 0x13000
	jmp $
